iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
自我挑戰組

ABAP 基礎30天學習筆記系列 第 29

Day29_為RESTful API添加程式邏輯(下)_Determination

  • 分享至 

  • xImage
  •  

原文連結:Adding ABAP logic

Determination

在航班轉機的應用程式中,包含了出發/抵達的機場、國家與城市。如下圖,期望上會希望使用者只需要輸入機場代碼就能連結相關資料,在ABAP RESTful API 中可以使用Determination來進行綁定。

https://ithelp.ithome.com.tw/upload/images/20240919/20113802AlicYeCuV7.png

行為定義中的determination寫法

首先,要在BO的行為定義中定義determination。以本例而言,determination名為getCities,只要當BO被儲存、AirportFromIDAirportToID任一欄位變更時就會呼叫。一樣可以在行為定義時,對決定按下ctrl+1並雙擊,建立對應程式碼在行為實體中。

"在行為定義中"
determination GetCities

on save { field AirportFromID, Airport ToID; }
"在行為實例中"
CLASS 1cl_handler DEFINITION INHERITING FROM cl_abap_behavior_handler.

PRIVATE SECTION.

METHODS:

getCities FOR DETERMINE ON SAVE IMPORTING keys FOR Connection~GetCities.

ENDCLASS.

determination流程

https://ithelp.ithome.com.tw/upload/images/20240919/20113802q1vvmt2s6d.png

當系統觸發determination,將觸發相關實體,輸入參數keys包含了被變更的資料,並如驗證同樣使用EML讀取資料,然而,在determination中需要使用UPDATE關鍵字來更新資料。

註:範例中的loop是為了簡化語法,可能導致SELECT的效能問題,實務上應盡量避免。

1. 讀入使用者輸入值

READ ENTITIES OF zs4d400_r_connection IN LOCAL MODE
       ENTITY Connection
       FIELDS (AirportFromID AirportToID)
         WITH CORRESPONDING #(keys )
       RESULT DATA (connections).

首先,一樣讀入使用者的輸入值,需要讀入的有 AirportFromIDAirportToID欄位,並由此自動完成城市及國家等資訊。

2. 搜尋輸入值的相關資料

LOOP AT connections INTO DATA (connection).

"讀入對應的出發地資訊"
SELECT SINGLE

    FROM /dmo/i_airport 
  FIELDS City, CountryCode 
   WHERE AirportID = @connection-AirportFromID 
    INTO (@connection-CityFrom, @connection-CountryFrom ).

"讀入對應的抵達地資訊"
SELECT SINGLE
  FROM /dmo/i_airport
FIELDS City, CountryCode 
 WHERE AirportID = @connection-Airport ToID 
  INTO (@connection-CityTo, @connection-CountryTo ).

"將資料放入指定表格中"
MODIFY connections FROM connection.

ENDLOOP.

在此使用CDS視圖/dmo/i_airport來搜尋國家與城市,並將資料透過INTO來指定放入的structure欄位,並使用MODIFY來回傳到 internal tableconnections中。

3. 變更回傳資料

DATA connections_upd TYPE TABLE FOR UPDATE zs4d400_r_connections.

connections_upd = CORRESPONDING #( connections ).

READ ENTITIES會回傳具有FOR READ RESULT型別的internal table作為回傳結果。如果要變更buffer中的資料,要使用MODIFY ENTITIES關鍵字,並將資料存入具有FOR UPDATE型別的internal table 中。雖然兩種形別的資料欄位相同,但在FOR UPDATE型別的表格中有一個名為%control的附加structure,包含了系統管理員的相關欄位。

注意,不能使用MODIFY ENTITIES來直接傳遞connections表格,因此在變更資料前,需要複製資料到適當型態的表格connections_upd中。

MODIFY ENTITIES OF zs4d400_r_connection IN LOCAL MODE
           ENTITY Connection
           UPDATE
           FIELDS (City From Country From City To Country To ) 
             WITH connections_upd
         REPORTED DATA (reported_records).

reported-connection = CORRESPONDING #(reported_records-connection ).

接著使用MODIFY ENTITIES在determination中更新資料,在FIELDS後指定欄位,並且使用WITH放入internal tableconnections_upd中,該表格需要有正確的資料型別,如範例中使用的就是TYPE TABLE FOR UPDATE zsd4d400_r_connection

MODIFY ENTITIES關鍵字也可用來回傳用REPORTED接收到的錯誤訊息,可以透過複製internal table的內容到determination方法的REPORTEDstructure,以將這些訊息傳到BO中。

明天來介紹如何改善程式的使用者體驗!


上一篇
Day28_為RESTful API添加程式邏輯(上)_Validation
下一篇
Day30_使用者體驗改善
系列文
ABAP 基礎30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言